PyQt5 多窗口应用中遇到的问题解决(父窗口与子窗口) | 您所在的位置:网站首页 › windows 7中能弹出对话框的操作是 › PyQt5 多窗口应用中遇到的问题解决(父窗口与子窗口) |
问题1:通过点击Button打开新窗口后,如何实现不关闭新窗口的情况下再点击Button时不会新建窗口,而是显示先前打开的窗口?(以前用tkinter时遇到这个问题,是使用一个boolean值来做开关,如果对象已创建,就不新建,否则新建,然后关闭窗口时在控制该boolean,该方法可行但是比较麻烦) 分析:有两种方法: 1.新建窗口时使用exec_()函数(显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止,函数返回一个DialogCode结果;在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭)。 但是我需要user在通过Button打开该窗口的同时,可以对父窗口进行操作,所以不使用exec_()函数 2.使用show()函数新建窗口(显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。) 使用show()新建的子窗口在打开时可以操作父窗口。此处,新建窗口有两种方法: (1)在槽函数中实例化窗口,然后.show()创建窗口: class MyMainWindow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.pushButton_1.clicked.connect(self.openGenWin) def closeEvent(self, event): self.genWin.close() event.accept() # 在槽函数openGenWin中实例化并调用show() def openGenWin(self): self.genWin = MyGeneratorWindow() self.genWin.show()点击Button后,子窗口正常打开,重复点击按钮,子窗口重复弹出 (2)在__init__()方法中实例化窗口,在槽函数中调用show() class MyMainWindow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.pushButton_1.clicked.connect(self.openGenWin) # 在构造方法中实例化窗口 self.genWin = MyGeneratorWindow() def closeEvent(self, event): self.genWin.close() event.accept() # 在槽函数中调用show() def openGenWin(self): self.genWin.show()重复点击Button后,子窗口不重复弹出 结果:使用方法2(2)即解决问题 该问题查阅过下列博客: https://blog.csdn.net/chengmo123/article/details/93379470 https://blog.csdn.net/weixin_40520077/article/details/104040414
问题2:PyQt5中目前不知道在父窗口与子窗口都开启时,如何做到关闭父窗口,子窗口也同时关闭,所以用重写父窗口的closeEvent(self, event)来解决: def closeEvent(self, event): self.genWin.close() event.accept()该方法是PyQt5中点击窗口右上角“X”时触发的函数 event参数:如果调用event.ignore()方法,则会使关闭窗口失效 如果调用event.accept()方法,则会关闭窗口 结果:要实现在关闭父窗口时子窗口同时关闭,则在重写该方法时,在event.accept()之前调用close()方法关闭子窗口。 |
CopyRight 2018-2019 实验室设备网 版权所有 |